package com.guigu.tms.test.entity;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.awt.geom.Path2D;
import java.util.List;

/**
 * @ClassName:Path
 * @Description://TODO
 * @Author:taoLong
 * @Date:2021/11/25:13:33 星期四
 * @email:2391611102@qq.com or 2391611102qq@gmail.com
 */
public class Path {

    /**
     * 使用Path2D创建一个多边形
     *
     * @param polygon 经纬度 集合
     * @return 返回Path2D.Double
     */
    private static Path2D.Double create(List<ScopeRequest> polygon) {

        //创建path2D对象

        Path2D.Double generalPath = new Path2D.Double();

        //获取第一个起点经纬度的坐标

        ScopeRequest first = polygon.get(0);

        //通过移动到以double精度指定的指定坐标，把第一个起点添加到路径中

        generalPath.moveTo(first.getLng(), first.getLat());

        //把集合中的第一个点删除防止重复添加

        polygon.remove(0);

        //循环集合里剩下的所有经纬度坐标

        for (ScopeRequest d : polygon) {

            //通过从当前坐标绘制直线到以double精度指定的新指定坐标，将路径添加到路径。

            //从第一个点开始，不断往后绘制经纬度点

            generalPath.lineTo(d.getLng(), d.getLat());

        }

        // 最后要多边形进行封闭，起点及终点

        generalPath.lineTo(first.getLng(), first.getLat());

        //将直线绘制回最后一个 moveTo的坐标来关闭当前子路径。

        generalPath.closePath();

        return generalPath;

    }

    /**
     * 判断点是否在区域内
     *
     * @param polygon   区域经纬度json字符串
     * @param longitude 经度
     * @param latitude  纬度
     * @return 返回true跟false
     */

    public static boolean isPoint(String polygon, double longitude, double latitude) {

        JSONArray jsonArray = JSON.parseArray(polygon);

        //将json转换成对象

        List<ScopeRequest> list = JSON.parseArray(jsonArray.toJSONString(), ScopeRequest.class);
        System.out.println("list = " + list);
        Path2D path2D = create(list);

        //true如果指定的坐标在Shape边界内; 否则为false 。

        return path2D.contains(longitude, latitude);

    }
}

@Data
class ScopeRequest {

    private Double lng;

    private Double lat;

    public ScopeRequest() {
    }

    public ScopeRequest(Double longitude, Double latitude) {

        this.lng = longitude;

        this.lat = latitude;

    }

}
